package cibertec.edu.pe.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cibertec.edu.pe.datos.entidades.Area;
import cibertec.edu.pe.datos.entidades.Usuario;
import cibertec.edu.pe.datos.service.UsuarioService;
import cibertec.edu.pe.enums.BloqueadoEnum;
import cibertec.edu.pe.enums.EstadoEnum;

@Controller("usuarioController")
@Scope("session")
public class UsuarioController {

    @Autowired
    @Qualifier("original")
    private UsuarioService usuarioService;
    private Usuario usuario;
    private String mensaje;
    private boolean activaRegistro;
    private boolean activaMensaje;
    private List<Usuario> listaUsuarios;
    private String area;
    private List<SelectItem> comboAreas;

    public UsuarioController() {

        usuario = new Usuario();
        mensaje = null;
        activaRegistro = true;
        activaMensaje = false;
        listaUsuarios = new ArrayList<Usuario>();
        area = null;
    }

    @PostConstruct
    public void init() {
        // anotacion PostContruct se usa cuando ya se construyo el
        // UsuarioController (y por tanto todas sus dependencias inyectadas)
        cargarAreas();
    }

    private void cargarAreas() {

        // NOTA: no se puede llamar en el constructor puesto que usuarioService
        // aun no es inyectado y vale null

        try {

            if (usuarioService == null) return;

            // bajo demanda la carga de la tabla catalogo
            if (comboAreas == null || comboAreas.isEmpty()) {

                comboAreas = new ArrayList<SelectItem>();
                List<Area> listaAreas = usuarioService.listarAreas();
                for (Area area : listaAreas) {
                    comboAreas.add(new SelectItem(area.getCodigoArea(), area.getNombreArea()));
                }

                // if (comboAreas.isEmpty()) {
                // comboAreas.add(new SelectItem(1, "tabla vacia"));
                // }

            }

        } catch (Exception e) {
            int error = 0;
            System.out.println("*** " + e.getMessage());
        }

    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public boolean isActivaRegistro() {
        return activaRegistro;
    }

    public void setActivaRegistro(boolean activaRegistro) {
        this.activaRegistro = activaRegistro;
    }

    public boolean isActivaMensaje() {
        return activaMensaje;
    }

    public void setActivaMensaje(boolean activaMensaje) {
        this.activaMensaje = activaMensaje;
    }

    public String guardar() {

        try {

            // el ID lo autogenera el objeto del negocio
            usuario.setEstado(EstadoEnum.ACTIVO.getValor());
            usuario.setBloqueado(BloqueadoEnum.NOBLOQUEADO.getValor());
            usuarioService.guardarCliente(usuario);
            listarClientes();

        } catch (Exception e) {
            int error = 0;
            System.out.println("*** " + e.getMessage());
        }

        return "listarUsuarios";
    }

    public String cancelar() {
        usuario = new Usuario();
        return "";
    }

    public void listarClientes() {

        try {
            listaUsuarios.clear();
            listaUsuarios = usuarioService.listarClientes();
        } catch (Exception e) {
            int error = 0;
            System.out.println("*** " + e.getMessage());
        }
    }

    public String regresar() {
        usuario = new Usuario();
        mensaje = null;
        activaRegistro = true;
        activaMensaje = false;
        listaUsuarios = new ArrayList<Usuario>();
        area = null;
        cargarAreas();
        return "mostrarRegistrarUsuario";
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public List<SelectItem> getComboAreas() {
        return comboAreas;
    }

    public void setComboAreas(List<SelectItem> comboAreas) {
        this.comboAreas = comboAreas;
    }
}
